#if !defined(__APP_DEVICE)
#define __APP_DEVICE

#include <pthread.h>
#include "app_buffer.h"
#include "app_message.h"
#include "app_pool.h"

// 定义设备类型的枚举
typedef enum
{
    DEV_GENERAL,
    DEV_SERIAL,
    DEV_CAN,
} DeviceType;

struct DeviceFuncs;

// 定义设备结构体
typedef struct
{
    char *filename; // 设备文件名
    int fd; // 文件描述符
    DeviceType type; // 设备类型
    ConnectionType conn_type; // 连接类型
    Buffer *read_buffer; // 设备读缓存
    Buffer *write_buffer; // 设备写缓存
    pthread_t read_thread; // 设备读线程
    int running; // 设备的读线程是否正在运行 0:停止 1:运行
    struct DeviceFuncs *funcs; // 设备相关函数
    long last_write_time; // 上一次写入数据的时间
} Device;


// 定义包含设备相关函数（需要子模块或其它模块来实现的）的结构体
struct DeviceFuncs
{
    // 读取设备文件数据后的处理函数 （由具体设备模块来指定）
    int (*post_read)(Device *, void *, int);
    // 准备将数据写入设备文件前的处理函数 （由具体设备模块来指定）
    int (*pre_write)(Device *, void *, int);
    // 发送消息数据给服务器的函数 （由路由模块来指定）
    int (*send_msg)(Device *, void *, int);
};

/**
 * @brief 初始化设备
 */
Device *app_device_init(char *filename);

/**
 * @brief 启动设备（启动设备读线程去不断读取文件中的数据）
 */
int app_device_start(Device *device);


/**
 * @brief 停止设备（取消设备读线程）
 */
int app_device_stop(Device *device);

/**
 * @brief 关闭设备
 */
void app_device_close(Device *device);

/**
 * 接收消息
 */
int app_device_recvMsg(Device *device, char *data, int len);


#endif // __APP_DEVICE
